이벤트소싱과 마이크로서비스 아키텍처.손경덕.에이콘출판사

Scraps

도메인 서비스의 책임은 여러가지 중 하나가 될 수 있다. 그 중에 하나가 바로 타입의 변환(Converting, Mapping) 이다. [1]

dto를 도메인 객체로 변환하거나 반대로도 가능. 값 객체로 변환하여 다른 엔티티가 합성하도록 도울 수도 있다. 나의 배송지 엔티티를 주문 배송지 값 객체로 변환할 때 도메인 서비스를 이용할 수 있다.

이런 것도 생각할 수도 있겠다. 레포지토리가 여러 테이블을 조인한 하나의 깊게 네스팅된 객체를 반환하더라도 도메인 서비스에서는 그냥 두 DTO를 인자로 받는 것이다. 어차피 FK 값이 제대로 연관되어만 있으면 레포지토리가 여러번의 쿼리로 만들었던, 빡센 쿼리를 사용해서 한 번에 만들었던 간에 서비스 레이어는 신경쓸 필요 없게 만드는 것이다.

비즈니스 프로세스에 참여하는 서비스에서 데이터베이스의 잠금 기능을 사용하지 않고 소프트 스테이트를 사용합니다. 데이터베이스 잠금과 달리 논리적임을 강조하기 위해 이를 의미적 잠금(Semantic Lock) 이라 부르기도 합니다. [2]

낙관적 잠금 (optimistic lock)을 활용한 이벤트 충돌방지 기법 [3] 참고.

Questions?


  1. p.61 ↩︎

  2. p.292 주문 담당자가 주문 목록을 조회하면 목록에는 보이지만 상태를 "결제 대기"로 표기하고 완료된 주문과 달리 주문확인, 배송 준비 중처럼 상태를 변경하는 명령을 내릴 수 없게 버튼들을 비활성화합니다. 백엔드는 아직 완료되지 않은 주문이 다른 커맨드를 받으면 상태를 확인해 적절한 결과를 반환해야 합니다. ↩︎

  3. p.176 낙관적 잠금을 사용하려면 변경 요청 시 사용자 인터페이스가 애그리게이트의 현재 버전 값을 알고 있어야 합니다. 따라서 사용자가 애그리게이트를 조회하면 백엔드는 현재 버전 값을 포함한 결과를 반환해야 합니다. 사용자가 애그리게이트 내용을 확인하고 변경을 요청하면 사용자 인터페이스는 애그리게이트의 버전을 커맨드에 포함해 백엔드에 전달합니다. ↩︎

  4. 상태 변화를 빠짐없이 기록하는 방법인 이벤트 소싱의 적용범위를 확대하면 사가도 마이크로서비스 아키텍처에서 결과적 일관성을 제공하기 위해 사용하는 특별한 목적을 가진 이벤트 소싱이라 할 수 있습니다. ↩︎